﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Controles.Validador.Componentes;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Mercaderia
{
    public partial class FrmRemito
#if DEBUG
 : AdaptadorFrm
#else
            : FrmBase
#endif
    {
        private readonly IRemitoManager _remitoManager;
        private readonly IProveedorManager _proveedorManager;
        private FrmProveedor _frmProveedor;

        public ConsultaRemito Remito { get; set; }

        protected override string Titulo
        {
            get { return "Remito"; }
        }

        private bool EsCoordinador
        {
            get { return ContextoUsuario.RolId == (int)Rol.Coordinador; }
        }

        public FrmRemito(IRemitoManager remitoManager, IProveedorManager proveedorManager)
        {
            if (remitoManager == null)
                throw new ArgumentNullException("remitoManager");
            if (proveedorManager == null)
                throw new ArgumentNullException("proveedorManager");

            _remitoManager = remitoManager;
            _proveedorManager = proveedorManager;
            InitializeComponent();
        }

        protected void GuardarRegistro()
        {
            if (!remitoValidador.Validate()) return;

            if (Remito != null)
            {
                if (!Remito.NumeroRemito.Equals(txtNroRemito.Text.Trim()))
                {
                    if (_remitoManager.ExisteRemito(txtNroRemito.Text.Trim()))
                    {
                        MostrarMensajeError(string.Format(Resources.Remito_Existe, txtNroRemito.Text.Trim()));
                        return;
                    }
                }
                ActualizarRemito();
            }
            else
            {
                //- Modo Creacion
                if (_remitoManager.ExisteRemito(txtNroRemito.Text.Trim()))
                {
                    MostrarMensajeError(string.Format(Resources.Remito_Existe, txtNroRemito.Text.Trim()));
                    return;
                }
                CrearRemito();
            }
        }

        private void CrearRemito()
        {
            var remito = InstanciarRemito();
            try
            {
                _remitoManager.CrearRemito(remito);
                MostrarMensajeExito(Resources.Remito_GuardoConExito);
                LimpiarControl(panel1);
                RefrescarCambios = true;
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.GuardoRemito_Error);
            }
        }

        private void ActualizarRemito()
        {
            var remito = InstanciarRemito();
            remito.RemitoId = Remito.RemitoId;
            try
            {
                _remitoManager.ActualizarRemito(remito);
                MostrarMensajeExito(Resources.Remito_GuardoConExito);
                RefrescarCambios = true;
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.GuardoRemito_Error);
            }
        }

        private void FrmRemito_Load(object sender, EventArgs e)
        {
            RefrescarCambios = false;
            CargarProveedores();
            CargarAñosCalendario();
            var date = DateTime.Now;
            cbDia.SelectedIndex = date.Day - 1;
            cbMes.SelectedIndex = date.Month - 1;
            cbAño.SelectedIndex = cbAño.FindStringExact(date.Year.ToString(), 0);
            if (Remito == null)
            {
                //Creacion
                return;
            }

            //Edicion
            MostrarDatosRemito();
            HabilitarControl(panel1, EsCoordinador);
            btnGuardarRemito.Visible = EsCoordinador;
        }

        private void remitoValidador_CustomValidation(object sender, ValidationEventArgs e)
        {
            if (e.Control == cmbProveedores)
            {
                e.Valid = cmbProveedores.SelectedIndex > 0;
            }
            if (e.Control == cbDia)
            {
                e.Valid = cbDia.SelectedIndex >= 0;
            }
            if (e.Control == cbAño)
            {
                e.Valid = cbAño.SelectedIndex >= 0;
            }
            if (e.Control == cbMes)
            {
                e.Valid = cbMes.SelectedIndex >= 0;
            }
        }

        private void CargarProveedores()
        {
            cmbProveedores.CargarItems(_proveedorManager.ObtenerProveedores(), "Nombre", "ProveedorId", true, "--- Seleccione un Proveedor ---");
        }

        private Remito InstanciarRemito()
        {
            return new Remito
            {
                NumeroRemito = txtNroRemito.Text.Trim(),
                FechaEntrega = new DateTime((int)(cbAño.SelectedItem), cbMes.SelectedIndex + 1, cbDia.SelectedIndex + 1),
                Observacion = txtObservacion.Text.Trim(),
                ProveedorId = ((Proveedor)cmbProveedores.SelectedItem).ProveedorId
            };
        }

        private void MostrarDatosRemito()
        {
            txtNroRemito.Text = Remito.NumeroRemito;
            var date = DateTime.Now;
            cbDia.SelectedIndex = date.Day - 1;
            cbMes.SelectedIndex = date.Month - 1;
            cbAño.SelectedIndex = cbAño.FindStringExact(date.Year.ToString(), 0);
            txtObservacion.Text = Remito.Observacion;
            cmbProveedores.SelectedIndex = cmbProveedores.FindStringExact(Remito.Proveedor, 0);
        }

        private void btnGuardarRemito_Click(object sender, EventArgs e)
        {
            GuardarRegistro();
        }

        private void CargarAñosCalendario()
        {
            for (var i = 2000; i <= DateTime.Now.AddYears(2).Year; i++)
            {
                cbAño.Items.Add(i);
            }
        }

        private void btnNuevoProveedor_Click(object sender, EventArgs e)
        {
            var delFrmCerrado = new FormClosedEventHandler(ProveedorFrmClosed);
            _frmProveedor = AbrirFormularioModal(_frmProveedor, delFrmCerrado);
        }

        private void ProveedorFrmClosed(object sender, FormClosedEventArgs e)
        {
            CargarProveedores();
        }
    }
}